package cn.tedu.jdbc;

import cn.tedu.jdbc.utils.DbUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 事务：实现转账功能
 */
public class JDBCTest21 {
    public static void main(String[] args) {
        //转账金额
        double money = 10000;
        //实现转账功能
        Connection conn = null;
        PreparedStatement ps1 = null;
        PreparedStatement ps2 = null;

        try {
            //获取连接
            conn = DbUtils.getConnection();

            //第一步：开启事务（将JDBC事务的自动提交机制修改为手动提交）
            conn.setAutoCommit(false);
            //将act-001账户余额减去10000
            String sql1 = "update t_act set balance = balance - ? where actno = ?";
            ps1 = conn.prepareStatement(sql1);
            ps1.setDouble(1,money);
            ps1.setString(2,"act-001");
            int count1 = ps1.executeUpdate();

           /* //模拟异常的发生
            String s = null;
            s.toString();*/

            //将act-002账户余额加上10000
            String sql2 = "update t_act set balance = balance + ? where actno = ?";
            ps2 = conn.prepareStatement(sql2);
            ps2.setDouble(1,money);
            ps2.setString(2,"act-002");
            int count2 = ps2.executeUpdate();

            //第二部：当整个业务流程成功的完整的结束了，提交事务（事务结束（成功的事务结束））
            conn.commit();
        } catch (SQLException e) {
            //第三部：只要有任何的异常发生则回滚事务（事务结束（失败的事务结束））
            try {
                conn.rollback();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
            throw new RuntimeException(e);
        } finally {
            DbUtils.close(null, ps1, null);
            DbUtils.close(null, ps2, null);
            DbUtils.close(conn, null, null);
        }
    }
}
